#include <iostream>
#include <vector>
#include <set>
#include <string>

using namespace std;

class BaseNode
{
    private:
    vector<BaseNode*> preNodePtrs;

    public:
    
    string nodeName;
    int posX;
    int posY;

    BaseNode(const string &name);
    void addPreNode(BaseNode *preNodePtr);
    void print();

    vector<BaseNode*> loop2CheckValid(vector<BaseNode*> & nodePathFromEnd, set<BaseNode*> & emptyPreNodes, set<BaseNode*> & nodes);
};

class ProcessGraph
{
    private:
    vector<BaseNode*> nodePtrs;

    protected:
    
    public:
    ProcessGraph();

    void addNode( BaseNode * node);
    void addNode2Node(BaseNode * nodeFrom, BaseNode * nodeTo);

    // 添加一串 节点到 处理图
    // node1 --> node2 --> nodeA --> nodeB --> nodeC --> nodeD --> nodeE --> nodeF
    void addNodeSequece(vector<BaseNode*> & nodeSequece);

    // 添加 1 to n 节点到 处理图
    // node1 -->   node2
    //         ↘   nodeA
    //         ↘   nodeB
    //         ↘   nodeC
    //         ↘   nodeD
    //         ↘   nodeE
    void addOne2MultiNodes(BaseNode * node, vector<BaseNode*> & nodeSequece);

    // 添加 n to 1 节点到 处理图
    // node2 --------> nodeF
    // nodeA ________↗
    // nodeB ________↗
    // nodeC ________↗
    // nodeD ________↗
    // nodeE ________↗
    void addMultiNodes2One(vector<BaseNode*> & nodeSequece, BaseNode * node);

    // 不能有环
    // 有唯一的起点 和 终点
    bool isValid(BaseNode* startNode, BaseNode* endNode);

    // 打印图
    void printGraph(BaseNode* startNode, BaseNode* endNode);
};

int processGraphDemo();
